package main

import "fmt"

/* 2. 两数相加  https://leetcode.cn/problems/add-two-numbers/ */

func ExecQ2() {
	//{
	//	var r1, r2 *ListNode
	//
	//	{
	//		node2 := &ListNode{Val: 3, Next: nil}
	//		node1 := &ListNode{Val: 4, Next: node2}
	//		r1 = &ListNode{Val: 2, Next: node1}
	//
	//	}
	//	{
	//		node2 := &ListNode{Val: 4, Next: nil}
	//		node1 := &ListNode{Val: 6, Next: node2}
	//		r2 = &ListNode{Val: 5, Next: node1}
	//
	//	}
	//	fmt.Println(addTwoNumbers(r1, r2))
	//}

	//{
	//	var r1, r2 *ListNode
	//	{
	//		r1 = &ListNode{Val: 0, Next: nil}
	//	}
	//	{
	//		r2 = &ListNode{Val: 0, Next: nil}
	//	}
	//	fmt.Println(addTwoNumbers(r1, r2))
	//}

	{
		var r1, r2 *ListNode
		{
			node6 := &ListNode{Val: 9, Next: nil}
			node5 := &ListNode{Val: 9, Next: node6}
			node4 := &ListNode{Val: 9, Next: node5}
			node3 := &ListNode{Val: 9, Next: node4}
			node2 := &ListNode{Val: 9, Next: node3}
			node1 := &ListNode{Val: 9, Next: node2}
			r1 = &ListNode{Val: 9, Next: node1}
		}
		{
			node3 := &ListNode{Val: 9, Next: nil}
			node2 := &ListNode{Val: 9, Next: node3}
			node1 := &ListNode{Val: 9, Next: node2}
			r2 = &ListNode{Val: 9, Next: node1}
		}
		fmt.Println(addTwoNumbers(r1, r2))
	}

	//{
	//	var r1, r2 *ListNode
	//	{
	//
	//		node2 := &ListNode{Val: 9, Next: nil}
	//		node1 := &ListNode{Val: 4, Next: node2}
	//		r1 = &ListNode{Val: 2, Next: node1}
	//	}
	//	{
	//		node3 := &ListNode{Val: 9, Next: nil}
	//		node2 := &ListNode{Val: 4, Next: node3}
	//		node1 := &ListNode{Val: 6, Next: node2}
	//		r2 = &ListNode{Val: 5, Next: node1}
	//	}
	//	fmt.Println(addTwoNumbers(r1, r2))
	//}
}

// 我写的
func addTwoNumbers1(l1 *ListNode, l2 *ListNode) *ListNode {
	mi := 0
	var r *ListNode
	for l1 != nil || l2 != nil || mi > 0 {
		i1, i2 := 0, 0
		if l1 != nil {
			i1 = l1.Val
			l1 = l1.Next
		}
		if l2 != nil {
			i2 = l2.Val
			l2 = l2.Next
		}

		ir := i1 + i2
		if mi == 10 {
			ir += 1
		}
		ii := 0
		if ir > 9 {
			ii = ir % 10
			mi = 10
		} else {
			ii = ir
			mi = 0
		}
		n := &ListNode{Val: ii}
		if r != nil {
			tmp := r
			for tmp != nil && tmp.Next != nil {
				tmp = tmp.Next
			}
			tmp.Next = n
		} else {
			r = n
		}

	}

	return r
}

// 官方的
func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {
	var tail *ListNode
	carry := 0
	for l1 != nil || l2 != nil {
		n1, n2 := 0, 0
		if l1 != nil {
			n1 = l1.Val
			l1 = l1.Next
		}
		if l2 != nil {
			n2 = l2.Val
			l2 = l2.Next
		}
		sum := n1 + n2 + carry
		sum, carry = sum%10, sum/10
		if head == nil {
			head = &ListNode{Val: sum}
			tail = head
		} else {
			tail.Next = &ListNode{Val: sum}
			tail = tail.Next
		}
	}
	if carry > 0 {
		tail.Next = &ListNode{Val: carry}
	}
	return
}
